package top.xia17.plugins.fast.common.mail;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.mail.MailAccount;
import lombok.Data;

import java.nio.charset.Charset;

/**
 * 邮箱配置
 *
 * @author xia17
 */
@Data
public class Xia17MailProperties {

    /**
     * SMTP服务器域名
     */
    private String host;
    /**
     * SMTP服务端口
     */
    private Integer port;
    /**
     * 是否需要用户名密码验证
     */
    private Boolean auth = true;
    /**
     * 用户名
     */
    private String user;
    /**
     * 密码
     */
    private String pass;
    /**
     * 发送方，遵循RFC-822标准
     */
    private String from;

    /**
     * 是否打开调试模式，调试模式会显示与邮件服务器通信过程，默认不开启
     */
    private Boolean debug = false;
    /**
     * 编码用于编码邮件正文和发送人、收件人等中文
     */
    private Charset charset = CharsetUtil.CHARSET_UTF_8;
    /**
     * 对于超长参数是否切分为多份，默认为false（国内邮箱附件不支持切分的附件名）
     */
    private Boolean splitLongParameters = false;
    /**
     * 对于文件名是否使用{@link #charset}编码，默认为 {@code true}
     */
    private Boolean encodeFilename = true;

    /**
     * 使用 STARTTLS安全连接，STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接（TLS或SSL）， 而不是使用一个单独的加密通信端口。
     */
    private Boolean starttlsEnable = false;

    /**
     * 使用 SSL安全连接
     */
    private Boolean sslEnable;

    /**
     * SSL协议，多个协议用空格分隔
     */
    private String sslProtocols;

    /**
     * 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字
     */
    private String socketFactoryClass = "javax.net.ssl.SSLSocketFactory";
    /**
     * 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true
     */
    private Boolean socketFactoryFallback = false;
    /**
     * 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口
     */
    private Integer socketFactoryPort = 465;

    /**
     * SMTP超时时长，单位毫秒，缺省值不超时
     */
    private Long timeout = 0L;
    /**
     * Socket连接超时值，单位毫秒，缺省值不超时
     */
    private Long connectionTimeout = 0L;


    /**
     * 转换成 hutool需要的邮箱账户类
     *
     * @return MailAccount
     */
    public MailAccount toMailAccount() {
        MailAccount mailAccount = new MailAccount();
        mailAccount.setHost(host);
        mailAccount.setPort(port);
        mailAccount.setAuth(auth);
        mailAccount.setUser(user);
        mailAccount.setPass(pass);
        mailAccount.setFrom(from);
        mailAccount.setDebug(debug);
        mailAccount.setCharset(charset);
        mailAccount.setSplitlongparameters(splitLongParameters);
        mailAccount.setEncodefilename(encodeFilename);
        mailAccount.setStarttlsEnable(starttlsEnable);
        mailAccount.setSslEnable(sslEnable);
        mailAccount.setSslProtocols(sslProtocols);
        mailAccount.setSocketFactoryClass(socketFactoryClass);
        mailAccount.setSocketFactoryFallback(socketFactoryFallback);
        mailAccount.setSocketFactoryPort(socketFactoryPort);
        mailAccount.setTimeout(timeout);
        mailAccount.setConnectionTimeout(connectionTimeout);
        return mailAccount;
    }


}
